package com.ys.Map集合;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 描述: Map集合的遍历方式
 * * 注意：Map集合不能直接使用Iterator迭代器，因为迭代器只能在List接口和Set接口中使用。
 *  * 1.遍历Map集合的方式
 *  * 方式一：使用keySet()方法
 *  *    作用：能够获得Map集合中的所有key值，然后把所有的key值封装成Set集合返回。
 *  * 方式二：使用entrySet()方法
 *  *    作用：能够获得Map集合中的键值对，该键值对封装在“Map.Entry”对象中，然后把所有的Entry对象封装成Set集合返回。
 *  * 2.Map集合key的唯一性
 *  *   添加键值对的时候，如果Map集合中已经存在某一个key，那么会执行覆盖操作，最终保持了key的唯一性。
 * @author CodeYang
 * @version 2020/12/26 20:45
 */
public class Map集合的遍历方式 {

    public static void main(String[] args) {
        // map 集合不是Collection 的子接口,所以没有迭代器实现,不能直接通过迭代器去遍历集合元素
        // 只有List 和 Set 接口的实现类中才可以使用迭代器
        Map<Integer, String> map = new HashMap<>();
        map.put(1,"1");
        map.put(2,"2");
        map.put(3,"3");
        map.put(4,"4");
        // 我们要遍历集合只能先把map 变为set集合 或者 list 集合
        // 常用方法1  Set<K> keySet(); : 转set
        //作用: 能够获得Map集合中的所有key值，然后把所有的 key 值封装成Set集合返回。
        Set<Integer> keySet = map.keySet();
        // 增强for循环的底层是使用iterator实现的 ,不管增强for循环可以遍历数组 和集合 而iterator 只能遍历 集合
        for (Integer key : keySet) {
            // 然后通过 map.get(key) 来获取 value
            System.out.println(map.get(key));
        }
        // 方式2: Set<Map.Entry<K, V>> entrySet();  返回所有的 键值对 关系
        //作用: 能够获得Map集合中的键值对，该键值对封装在“Map.Entry”对象中，然后把所有的Entry对象封装成Set集合返回。
        Set<Map.Entry<Integer, String>> entries = map.entrySet();
        Iterator<Map.Entry<Integer, String>> iterator = entries.iterator();
        while (iterator.hasNext()){
            Map.Entry<Integer, String> entry = iterator.next();
            System.out.println(entry.getKey()+"--"+entry.getValue());
        }
        System.out.println();
        // 3 转list对象  Lambda表达式
        List<Map.Entry<Integer, String>> collect = map.entrySet().stream().collect(Collectors.toList());
        collect.forEach(System.out::println);

        System.out.println("-----------");

        ArrayList<Map.Entry<Integer, String>> entries1 = new ArrayList<>(map.entrySet());
        for (Map.Entry<Integer, String> entry : entries1) {
            System.out.println(entry.getKey()+"|"+entry.getValue());
        }


    }
}
